home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stngpasm / pure_c / include / uran / uran_jar.sh < prev    next >
Encoding:
Text File  |  1997-08-08  |  7.9 KB  |  300 lines

  1. ;----------------------------------------------------------------------------
  2. ;File name:    URAn_JAR.SH            Revision date:    1997.08.08
  3. ;Creator:    Ulf Ronald Andersson        Creation date:    1992.11.15
  4. ;(c)1992 by:    Ulf Ronald Andersson        All rights reserved
  5. ;Released as:    FREEWARE            (commercial sale forbidden)
  6. ;----------------------------------------------------------------------------
  7. ;Purpose:    Macro library for cookie jar operations
  8. ;----------------------------------------------------------------------------
  9. ;Required header declarations:
  10. ;
  11. ;    include    "uran\STRUCT.SH"
  12. ;    include    "uran\URAn_SYS.SH"
  13. ;    include    "uran\URAn_DOS.SH"
  14. ;    include    "uran\URAn_JAR.SH"
  15. ;
  16. ;----------------------------------------------------------------------------
  17. ;    Library macros:
  18. ;
  19. ;get_jar_size            => d0  = Total number of entries in jar
  20. ;get_jar_used            => d0  = Number of used entries incl endmark
  21. ;seek_cookie    string        => d0 -> cookie/err_code flagged PL/MI
  22. ;eval_cookie    string        => d0  = cookie_value/err_code flagged PL/MI
  23. ;make_cookie    string,value    => d0 -> new cookie/=err_code flagged PL/MI
  24. ;edit_cookie    string,value    => d0 -> edited cookie/=err flagged PL/MI
  25. ;extend_jar    add_entries    => creates new enlarged cookie jar
  26. ;set_new_jar    jar_ptr        => activates new jar and its reset routine
  27. ;
  28. ;'make_cookie' trashes d1, all others only affect d0 + flags.
  29. ;These macros should only be used in supervisor mode.
  30. ;----------------------------------------------------------------------------
  31. ;NB: You must include the following line somewhere after the macro calls
  32. ;    "make    JAR_links"
  33. ;NB: That will cause the needed routines to be included at that point.
  34. ;NB: You may do this several times (after further calls), and at each
  35. ;NB: point only the 'newly' referenced routines will be added to the code.
  36. ;NB: A dummy reference macro exists, so routines can be added to code even
  37. ;NB: without calling them.  The macro is '_uniref', used as below:
  38. ;    "_uniref reset_old_jar"
  39. ;NB: "reset_old_jar" is the only part of a cookie program that _must_ remain
  40. ;NB: resident until reset when the jar has been extended.
  41. ;NB: To simplify this, its code is location independent.
  42. ;----------------------------------------------------------------------------
  43. ;    Macro definitions:
  44. ;
  45. .MACRO    JAR_links
  46.     _unidef    get_jar_size,get_jar_used,seek_cookie
  47.     _unidef    eval_cookie,edit_cookie,make_cookie
  48.     _unidef    extend_jar,set_new_jar,reset_old_jar
  49. .ENDM    JAR_links
  50. ;
  51.     _unidec    get_jar_size
  52.     _unidec    get_jar_used
  53.     _unidec    seek_cookie
  54.     _unidec    eval_cookie
  55.     _unidec    edit_cookie
  56.     _unidec    make_cookie
  57.     _unidec    extend_jar
  58.     _unidec    set_new_jar
  59.     _unidec    reset_old_jar
  60. ;
  61. .MACRO    get_jar_size
  62.     _uniref    get_jar_size
  63.     bsr    code_get_jar_size
  64. .ENDM    get_jar_size
  65. ;
  66. .MACRO    code_get_jar_size
  67.     move.l    a0,-(sp)
  68.     move.l    (_cookies).w,d0
  69. op_isym    beq.s,.done,uni__v
  70.     move.l    d0,a0
  71. sl_isym    .loop,uni__v
  72.     tst.l    (a0)
  73. op_isym    beq.s,.atend,uni__v
  74.     addq.l    #8,a0
  75. op_isym    bra.s,.loop,uni__v
  76. ;
  77. sl_isym    .atend,uni__v
  78.     move.l    4(a0),d0
  79. sl_isym    .done,uni__v
  80.     move.l    (sp)+,a0
  81.     rts
  82. uni__v    =    uni__v+1
  83. .ENDM    code_get_jar_size
  84. ;
  85. ;
  86. .MACRO    get_jar_used
  87.     _uniref    get_jar_used
  88.     bsr    code_get_jar_used
  89. .ENDM    get_jar_used
  90. ;
  91. .MACRO    code_get_jar_used
  92.     move.l    a0,-(sp)
  93.     move.l    (_cookies).w,d0
  94. op_isym    beq.s,.done,uni__v
  95.     move.l    d0,a0
  96.     clr    d0
  97. sl_isym    .loop,uni__v
  98.     addq    #1,d0
  99.     tst.l    (a0)
  100. op_isym    beq.s,.done,uni__v
  101.     addq.l    #8,a0
  102. op_isym    bra.s,.loop,uni__v
  103. ;
  104. sl_isym    .done,uni__v
  105.     move.l    (sp)+,a0
  106.     rts
  107. uni__v    =    uni__v+1
  108. .ENDM    code_get_jar_used
  109. ;
  110. ;
  111. .MACRO    seek_cookie    name
  112.     _uniref    seek_cookie
  113.     move.l    name,d0
  114.     bsr    code_seek_cookie
  115. .ENDM    seek_cookie
  116. ;
  117. .MACRO    code_seek_cookie
  118.     movem.l    d6-d7/a0,-(sp)
  119.     move.l    d0,d7
  120.     moveq    #-34,d0        ;prep 'path not found' error
  121.     move.l    (_cookies).w,d6
  122. op_isym    beq.s,.exit,uni__v
  123.     move.l    d6,a0
  124.     moveq    #-33,d0        ;prep 'file not found' error
  125. sl_isym    .loop,uni__v
  126.     tst.l    (a0)
  127. op_isym    beq.s,.exit,uni__v
  128.     cmp.l    (a0),d7
  129. op_isym    beq.s,.found,uni__v
  130.     addq.l    #8,a0
  131. op_isym    bra.s,.loop,uni__v
  132. ;
  133. sl_isym    .found,uni__v
  134.     move.l    a0,d0
  135. sl_isym    .exit,uni__v
  136.     tst.l    d0
  137.     movem.l    (sp)+,d6-d7/a0
  138.     rts        ;return pl,d0->cookie or mi,d0=err_code
  139. uni__v    =    uni__v+1
  140. .ENDM    code_seek_cookie
  141. ;
  142. ;
  143. .MACRO    eval_cookie    name
  144.     _uniref    eval_cookie
  145.     move.l    name,d0
  146.     bsr    code_eval_cookie
  147. .ENDM    eval_cookie
  148. ;
  149. .MACRO    code_eval_cookie
  150.     move.l    a0,-(sp)
  151.     seek_cookie    d0
  152. op_isym    bmi.s,.exit,uni__v
  153.     move.l    d0,a0        ;a0 -> cookie   (but still flagging PL)
  154.     movem.l    4(a0),d0    ;d0  = cookie value (still flagging PL)
  155. sl_isym    .exit,uni__v
  156.     move.l    (sp)+,a0
  157.     rts        ;return  pl,d0==cookie_value  or  mi,d0==err_code
  158. uni__v    =    uni__v+1
  159. .ENDM    code_eval_cookie
  160. ;
  161. ;
  162. .MACRO    edit_cookie    name,value
  163.     _uniref    edit_cookie
  164.     move.l    name,d0
  165.     move.l    value,d1
  166.     bsr    code_edit_cookie
  167. .ENDM    edit_cookie
  168. ;
  169. .MACRO    code_edit_cookie
  170.     move.l    a0,-(sp)
  171.     seek_cookie    d0
  172. op_isym    bmi.s,.exit,uni__v
  173.     move.l    d0,a0        ;a0 -> cookie   (still flagging PL)
  174.     movem.l    d1,4(a0)    ;cookie value = d1 (still flagging PL)
  175. sl_isym    .exit,uni__v
  176.     move.l    (sp)+,a0
  177.     rts        ;return  pl,d0->cookie  or  mi,d0==err_code
  178. uni__v    =    uni__v+1
  179. .ENDM    code_edit_cookie
  180. ;
  181. ;
  182. .MACRO    make_cookie    name,value
  183.     _uniref    make_cookie
  184.     move.l    name,d0
  185.     move.l    value,d1
  186.     bsr    code_make_cookie
  187. .ENDM    make_cookie
  188. ;
  189. .MACRO    code_make_cookie
  190.     movem.l    d2-d3/a0,-(sp)
  191.     move.l    d0,d2
  192.     seek_cookie    d0
  193.     bmi.s    .make_cookie_new
  194.     moveq    #E_ACCDN,d0        ;old cookie => 'access illegal/denied'
  195.     bra.s    .make_cookie_exit
  196. ;
  197. .make_cookie_new:
  198.     get_jar_size
  199.     move    d0,d3
  200.     get_jar_used
  201.     sub    d0,d3
  202.     bgt.s    .have_room
  203.     extend_jar    #32
  204.     bmi.s    .make_cookie_exit
  205.     get_jar_used
  206. .have_room:
  207.     subq    #1,d0
  208.     lsl.w    #3,d0
  209.     move.l    (_cookies).w,a0
  210.     adda    d0,a0
  211.     clr.l    8(a0)
  212.     move.l    4(a0),12(a0)
  213.     move.l    d2,(a0)
  214.     move.l    d1,4(a0)
  215.     move.l    a0,d0
  216. .make_cookie_exit:
  217.     tst.l    d0
  218.     movem.l    (sp)+,d2-d3/a0
  219.     rts    ;return  pl,d0->cookie  or  mi,d0==err_code
  220. .ENDM    code_make_cookie
  221. ;
  222. ;
  223. .MACRO    extend_jar    add_entries
  224.     _uniref    extend_jar
  225.     move.l    add_entries,d0
  226.     bsr    code_extend_jar
  227. .ENDM    extend_jar
  228. ;
  229. .MACRO    code_extend_jar
  230.     movem.l    d1-d7/a0-a6,-(sp)
  231.     andi.l    #$FFFF,d0
  232.     move.l    d0,d7            ;d7 = size of jar extension
  233.     get_jar_size            ;d0 = size of old jar (in entries)
  234.     add.l    d7,d0            ;d0 = size of new jar (in entries)
  235.     move.l    d0,d7            ;d7 = size of new jar (in entries)
  236.     lsl.w    #3,d0
  237.     gemdos    Malloc,d0
  238.     tst.l    d0
  239.     bmi.s    .extend_cookie_exit
  240.     move.l    d0,a2            ;a2 -> new_jar
  241.     move.l    d0,a0            ;a0 -> new_jar
  242.     move.l    (_cookies).w,a1        ;a1 -> old_jar
  243.     get_jar_used            ;d0 = used size of jar
  244.     subq    #1,d0            ;prep for dbra
  245.     bmi.s    .set_limit        ;skip move if no jar
  246.     bra.s    .move_next        ;do move excluding limit_mark
  247. ;
  248. .move_loop:
  249.     move.l    (a1)+,(a0)+
  250.     move.l    (a1)+,(a0)+
  251. .move_next:
  252.     dbra    d0,.move_loop
  253. .set_limit:
  254.     clr.l    (a0)+
  255.     move.l    d7,(a0)
  256.     move.l    a2,d0
  257.     set_new_jar    d0
  258. .extend_cookie_exit:
  259.     tst.l    d0
  260.     movem.l    (sp)+,d1-d7/a0-a6
  261.     rts    ;return  pl,d0->cookie_jar  or  mi,d0==err_code
  262. .ENDM    code_extend_jar
  263. ;
  264. ;----------------------------------------------------------------------------
  265. ;    Here is the XBRA_linked reset routine to remove altered cookie jar,
  266. ;    with the necessary variables, and the installation routine
  267. ;
  268. .MACRO    set_new_jar    jar_ptr
  269.     _uniref    set_new_jar
  270.     move.l    jar_ptr,d0
  271.     bsr    code_set_new_jar
  272. .ENDM    set_new_jar
  273. ;
  274. .MACRO    code_set_new_jar
  275.     _uniref    reset_old_jar
  276.     move.l    (_cookies).w,_cookies_save
  277.     move.l    (resvalid).w,resvalid_save
  278.     move.l    (resvector).w,resvector_save
  279.     move.l    #uncookie_reset,(resvector).w
  280.     move.l    #$31415926,(resvalid).w
  281.     move.l    d0,(_cookies).w        ;activate new_jar
  282.     rts
  283. .ENDM    code_set_new_jar
  284. ;
  285. .MACRO    code_reset_old_jar
  286. _cookies_save:        dc.l    0
  287. resvalid_save:        dc.l    0
  288.             dc.l    'XBRA','UnCk'
  289. resvector_save:        dc.l    0
  290. uncookie_reset:
  291.     move.l    _cookies_save(pc),(_cookies).w
  292.     move.l    resvector_save(pc),(resvector).w
  293.     move.l    resvalid_save(pc),(resvalid).w
  294.     jmp    (a6)    ;NB:reset routine can not use standard linking
  295. .ENDM    code_reset_old_jar
  296. ;
  297. ;----------------------------------------------------------------------------
  298. ;end of file:    URAn_JAR.SH
  299. ;----------------------------------------------------------------------------
  300.